package collection;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/**
 * 排序自定义类型元素
 */
public class SortListDemo2 {
    public static void main(String[] args) {
        List<Point> list = new ArrayList<>();
        list.add(new Point(5, 7));
        list.add(new Point(13, 28));
        list.add(new Point(9, 6));
        list.add(new Point(4, 4));
        list.add(new Point(1, 2));
        list.add(new Point(77, 98));
        System.out.println(list);

        /*
        Collections.sort(List list)
        该方法要求集合元素必须实现接口:Comparabie,否则编译不通过
        compareTo用来定义两个实例间比较大小的规则
        像包装类.String等都实现了该接口

        如果该方法不能直接使用,不建议使用了,因此该方法对我们的代码产生了侵入性
        侵入性:当我们使用某个API时,其要求我们为其更改其他地方的的代码,这就是侵入性
        侵入性不利于后期代码维护,应当尽量避免
         */


//        Collections.sort(list);
//        Comparator<Point> c = new Comparator<Point>() {
//            /*
//                compare:比较
//               该方法用于比较参数o1与o2的大小。
//               返回值规定:
//               当返回值>0时，则表示o1>o2
//               当返回值<0时，表示o1<o2
//               当返回值=0时，表示o1=o2
//             */
//            public int compare(Point o1, Point o2) {
//                //点到原点的距离长的大
//                int olen1 = o1.getX() * o1.getX() * o1.getX() * o1.getX();
//                int olen2 = o2.getX() * o2.getX() * o2.getX() * o2.getX();
//                return olen1 - olen2;
//            }
//        };


        //没有侵入性的写法,在调用sort时使用匿名内部类临时传入一个比较规则进行排序
//        Collections.sort(list, new Comparator<Point>() {
//            public int compare(Point o1, Point o2) {
//                //点到原点的距离长的大
//                int olen1 = o1.getX() * o1.getX() * o1.getX() * o1.getX();
//                int olen2 = o2.getX() * o2.getX() * o2.getX() * o2.getX();
//                return olen1 - olen2;
//            }
//        });

        Collections.sort(list,
                (o1, o2) ->
                        o1.getX()*o1.getX()+o1.getY() * o1.getY()-
                        o2.getX() * o2.getX()-o2.getY() * o2.getY()
        );
        System.out.println(list);
    }
}
